#ifndef __UDF_GLOBAL_H
#define __UDF_GLOBAL_H

#include <stdint.h>

#include "sdk_ifs_udk_cfg.h"
#include "udp_def.h"
#include "develop_def.h"
#include "udf_global_sys.h"

#include "udf_cfg.h"
#include "udp_def.h"

/* 用户宏定义 */
#define FW_VERSION_CAT(a,b) a##_30.2.0.##b\n
#define MACRO_STR(x) #x
#define TO_STR(x) MACRO_STR(x)
#define PAGE_PACK_LEN (128)
#define UDFDEF_CFAR_R_THRESDIV              ( CFAR_THRESDIV4 )
#define OTA_STATUS_IDLE        (0)
#define OTA_STATUS_DOWNLOAD    (1)
#define OTA_STATUS_OTA_WRITE   (2)
#define OTA_STATUS_INFO_WRITE  (3)
#define CNT_TIME 180
#define UDPCFG_SYNCW                        ( 0x0000FF00 )
#define UDPCFG_CHIRPW                       ( 0x000000FF )

#define UDPCFG_RAMP_WM                      ( UDP_CFG_RAMP_WAVE0_WAVE1_ONCE )

#define UDFDEF_RAMP_CNT                     ( UDFDEF_CHIRP_SUM_NUM )
#define UDFDEF_CYCLE_NUM                    ( 1 )
																				   
#define UDFDEF_ADCSAMP_NUM                  ( 1<<UDFDEF_ADCSAMP_NUMLOG )
#define UDFDEF_CHIRP_SUM_NUM                ( 1 ) // max:16chirp
#define UDFDEF_CHIRP_NUM                    ( 1 )
#define UDFDEF_ANT_NUM                      ( DEMO_RX_ANT_NUM )

#define UDFDEF_VEL_NUM                      ( 1 )


#define UDFDEF_ANT2_CALIB_AP_PSF            ( 0x0EDFD9D3 ) // psf:convert from fixed point(i = -1153,r = 6611)

//#define UDFDEF_ANT2_CALIB_AP_PSF            ( 0x0EDB1AF3 ) // psf:convert from fixed point(i = -1172,r = 6899)


#include "udf_global_bd_evb.h"

//#if ( BOARD_ID == 1 ) && ( RAMP_BANDWIDTH == 0 ) // USR 250M
//#if DEMO_RX_ANT_NUM < 2
//#define FW_VERSION TO_STR(FW_VERSION_CAT(1T1R220,0))
//#else
//#define FW_VERSION TO_STR(FW_VERSION_CAT(1T2R220,0))
//#endif
//#include "udf_global_bd_evb.h"
//#else
//#error unknown BOARD_ID or RAMP_BANDWIDTH
//#endif


///* uart output buffer*/ 
//#define UDFDEF_DP_CFG2_FRAME                             ( (GET_OFFSET(UDFDEF_ADDR_ADCSAMP)/0x4000) << 24 )
//#define UDFDEF_BKUP_FRAME_NUM                            ( 1 ) // 1/2 最大2
//#define UDFDEF_RANGE_REFINE_USE                          ( 128 )
//#define UDFDEF_RANGE_REFINE_FFT_PT                       ( FFT_PT256 )

//#define UDFDEF_SIZE_FFT1D_REFINE_PER_ANT                 ( UDFDEF_RANGE_REFINE_USE*NUM_BYTE32 )
//#define UDFDEF_SIZE_FFT1D_REFINE                         ( UDFDEF_RANGE_REFINE_USE*NUM_BYTE32*UDFDEF_ANT_NUM )
//#define UDFDEF_SIZE_FFT1D_PER_ANT                        ( UDFDEF_RANGE_USE*NUM_BYTE32 )
//#define UDFDEF_SIZE_FFT1D                                ( UDFDEF_RANGE_USE*NUM_BYTE32*UDFDEF_ANT_NUM )
//#define UDFDEF_SIZE_CHIRPSUM                             ( UDFDEF_ADCSAMP_NUM*NUM_BYTE32*UDFDEF_ANT_NUM )

///*abuf0 */
//#define UDFDEF_ADDR_FFT1D_OLD                            ( BBE_ABUF0_BASE + 0 ) //UDFDEF_SIZE_FFT1D
//#define UDFDEF_ADDR_FFT1D_OLDER                          ( UDFDEF_ADDR_FFT1D_OLD + UDFDEF_SIZE_FFT1D ) //UDFDEF_SIZE_FFT1D
//#define UDFDEF_ADDR_FFT3D_PRE                            ( UDFDEF_ADDR_FFT1D_OLDER + UDFDEF_SIZE_FFT1D ) // 1024 CFAR_MAX_NUM*ANT_MAX_NUM*NUM_BYTE32
//#define UDFDEF_ADDR_FFT1D_ANT2_CALIB                     ( UDFDEF_ADDR_FFT3D_PRE + CFAR_MAX_NUM*ANT_MAX_NUM*NUM_BYTE32)      //UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_CHIRPSUM_NOW                         ( UDFDEF_ADDR_FFT1D_ANT2_CALIB + UDFDEF_SIZE_FFT1D_PER_ANT ) // UDFDEF_SIZE_CHIRPSUM
//#define UDFDEF_ADDR_CHIRPSUM_OLD                         ( UDFDEF_ADDR_CHIRPSUM_NOW + UDFDEF_SIZE_CHIRPSUM ) //UDFDEF_SIZE_CHIRPSUM
//#define UDFDEF_ADDR_CHIRPSUM_OLDER                       ( UDFDEF_ADDR_CHIRPSUM_OLD + UDFDEF_SIZE_CHIRPSUM ) //UDFDEF_SIZE_CHIRPSUM 
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1_TMP        ( UDFDEF_ADDR_CHIRPSUM_OLDER + UDFDEF_SIZE_CHIRPSUM )              // UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT1_TMP      ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1_TMP    + UDFDEF_SIZE_FFT1D_PER_ANT ) // UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_DIFF          ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT1_TMP  + UDFDEF_SIZE_FFT1D_PER_ANT ) // UDFDEF_SIZE_FFT1D_REFINE
//#define UDFDEF_ADDR_ANT2_CALIB_AP_PSF_ABUF0              ( UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_DIFF + UDFDEF_SIZE_FFT1D_REFINE ) // 4

///*abuf1 */
//#define UDFDEF_ADDR_ADCSAMP                              ( BBE_ABUF1_BASE + 0 )

//#define UDFDEF_ADDR_FFT1D                                ( BBE_ABUF1_BASE + 0 ) //UDFDEF_SIZE_FFT1D
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1_ADD_ANT2   ( UDFDEF_ADDR_FFT1D + UDFDEF_SIZE_FFT1D ) //UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT1_ADD_ANT2 ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1_ADD_ANT2 + UDFDEF_SIZE_FFT1D_PER_ANT )   //UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_OLD_ANT2_CALIB                 ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT1_ADD_ANT2 + UDFDEF_SIZE_FFT1D_PER_ANT) //UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_OLDER_ANT2_CALIB               ( UDFDEF_ADDR_FFT1D_OLD_ANT2_CALIB + UDFDEF_SIZE_FFT1D_PER_ANT )     // UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_NOW           ( UDFDEF_ADDR_FFT1D_OLDER_ANT2_CALIB + UDFDEF_SIZE_FFT1D_PER_ANT ) //UDFDEF_SIZE_FFT1D_REFINE
//#define UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_OLD_OR_OLDER_ANT2_TMP ( UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_NOW + UDFDEF_SIZE_FFT1D_REFINE ) //UDFDEF_SIZE_FFT1D_REFINE_PER_ANT
//#define UDFDEF_ADDR_ANGLE_RSLT                           ( UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_OLD_OR_OLDER_ANT2_TMP + UDFDEF_SIZE_FFT1D_REFINE_PER_ANT ) // ANGLE_NUM*NUM_BYTE32

//#define UDFDEF_ADDR_BKUP_FRAME_A                         ( BBE_ABUF1_BASE + 8*1024 )
//#define UDFDEF_ADDR_BKUP_FRAME_B                         ( BBE_ABUF1_BASE + 12*1024)

///*abuf2  winrange*/
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1            ( BBE_ABUF2_BASE + 0 )              // UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT1          ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1    + UDFDEF_SIZE_FFT1D_PER_ANT ) // UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT2            ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT1 + UDFDEF_SIZE_FFT1D_PER_ANT )            // UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT2          ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT2   + UDFDEF_SIZE_FFT1D_PER_ANT )  // UDFDEF_SIZE_FFT1D_PER_ANT
//#define UDFDEF_ADDR_WIN_RANGE                            ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLDER_ANT2    + UDFDEF_SIZE_FFT1D_PER_ANT )   // 512 WIN_MAX_LEN*NUM_BYTE16
//#define UDFDEF_ADDR_CFAR2_CACHE                          ( UDFDEF_ADDR_WIN_RANGE + WIN_MAX_LEN*NUM_BYTE16 )    // 512 CFAR_MAX_NUM*NUM_BYTE32
//#define UDFDEF_ADDR_ARRAY_CALIB                          ( UDFDEF_ADDR_CFAR2_CACHE + CFAR_MAX_NUM*NUM_BYTE32 ) // 512 NUM_ANGLE*ANT_MAX_NUM*NUM_BYTE32
//#define UDFDEF_ADDR_POINT_RST                            ( UDFDEF_ADDR_ARRAY_CALIB + NUM_ANGLE*ANT_MAX_NUM*NUM_BYTE32 ) // 1024+4 CFAR_MAX_NUM*8+4
//#define UDFDEF_ADDR_ANT2_CALIB_AP_PSF                    ( UDFDEF_ADDR_POINT_RST + CFAR_MAX_NUM*8+4 )           // 4Byte
//#define UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_OLD_OR_OLDER  ( UDFDEF_ADDR_ANT2_CALIB_AP_PSF + 4 ) // UDFDEF_SIZE_FFT1D_REFINE
//#define UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_NOW_ANT2_TMP  ( UDFDEF_ADDR_FFT1D_REFINEMENT_FRAME_OLD_OR_OLDER + UDFDEF_SIZE_FFT1D_REFINE )  // UDFDEF_SIZE_FFT1D_REFINE_PER_ANT

#define UDFDEF_ADC_BKUP_CHIRP_NUM_MAX       ( 2 ) //空间不够 至多能备份2个chirp
#define UDFDEF_BKUP_FRAME_NUM               ( 1 )

// ARRAY CALIB  @4K                    
#define UDFDEF_ADDR_ARRAY_CALIB             ( BBE_ABUF2_BASE    + 4*1024 )// 512 WIN_MAX_LEN*NUM_BYTE16

// CFAR2 CFAR2 FFT3D_PRE POINT_RST @0K
#define UDFDEF_ADDR_WIN_RANGE               ( BBE_ABUF0_BASE    + 8*1024 )                        // 512 WIN_MAX_LEN*NUM_BYTE16
#define UDFDEF_ADDR_CFAR2_CACHE             ( UDFDEF_ADDR_WIN_RANGE + WIN_MAX_LEN*NUM_BYTE16 )    // 512 CFAR_MAX_NUM*NUM_BYTE32
#define UDFDEF_ADDR_FFT3D_PRE               ( UDFDEF_ADDR_CFAR2_CACHE + CFAR_MAX_NUM*NUM_BYTE32 ) // 1024 CFAR_MAX_NUM*ANT_MAX_NUM*NUM_BYTE32
#define UDFDEF_ADDR_POINT_RST               ( UDFDEF_ADDR_FFT3D_PRE + CFAR_MAX_NUM*ANT_MAX_NUM*NUM_BYTE32 ) // 1024+4 CFAR_MAX_NUM*8+4

#define UDFDEF_ADDR_ADCSAMP                     ( BBE_ABUF1_BASE + 0 )
#define UDFDEF_ADDR_CHIRPSUM                    ( BBE_ABUF2_BASE + 0 )
#define UDFDEF_ADDR_FFT1D                       ( BBE_ABUF1_BASE + 0 )
#define UDFDEF_DP_CFG2_FRAME                    ( (GET_OFFSET(UDFDEF_ADDR_ADCSAMP)/0x4000) << 24 )

#define UDFDEF_ADDR_FRAME_RECOVER_ADCSAMP_OLD   ( BBE_ABUF0_BASE + 0 )
#define UDFDEF_ADDR_FRAME_RECOVER_ADCSAMP_OLDER ( BBE_ABUF0_BASE + UDFDEF_ADCSAMP_NUM*UDFDEF_ANT_NUM )

#define UDFDEF_ADDR_FRAME_RECOVER_FFT1D_OLD     ( BBE_ABUF0_BASE + 0 )
#define UDFDEF_ADDR_FRAME_RECOVER_FFT1D_OLDER   ( BBE_ABUF0_BASE + UDFDEF_RANGE_USE*UDFDEF_ANT_NUM*NUM_BYTE32 )

#define UDFDEF_ADDR_FFT1D_MINUS                 ( BBE_ABUF2_BASE + 0 )
																						    
#define UDFDEF_ADDR_FFT1D_ANT1_MINUS_OLD        ( UDFDEF_ADDR_FFT1D_MINUS )
#define UDFDEF_ADDR_FFT1D_ANT1_MINUS_OLDER      ( UDFDEF_ADDR_FFT1D_ANT1_MINUS_OLD   + UDFDEF_RANGE_USE*NUM_BYTE32 )
#define UDFDEF_ADDR_FFT1D_ANT2_MINUS_OLD        ( UDFDEF_ADDR_FFT1D_ANT1_MINUS_OLDER + UDFDEF_RANGE_USE*NUM_BYTE32 )
#define UDFDEF_ADDR_FFT1D_ANT2_MINUS_OLDER      ( UDFDEF_ADDR_FFT1D_ANT2_MINUS_OLD   + UDFDEF_RANGE_USE*NUM_BYTE32 )
#define UDFDEF_ADDR_FFT1D_OSCFAR_TEST           ( UDFDEF_ADDR_FFT1D_ANT2_MINUS_OLDER + UDFDEF_RANGE_USE*NUM_BYTE32 )

#define UDFDEF_ADDR_FFT2D                       ( UDFDEF_ADDR_FFT1D_ANT1_MINUS_OLD )
																					     
#define UDFDEF_ADDR_ANGLE_RSLT                  ( BBE_ABUF1_BASE + 0 )



//#if defined(DEMO_ANT_SUM) && (DEMO_ANT_SUM == 1) && (UDFDEF_ANT_NUM>1)
//#define UDFDEF_ADDR_FFT2D                       ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1_ADD_ANT2 )
//#else
//#define UDFDEF_ADDR_FFT2D                       ( UDFDEF_ADDR_FFT1D_FRAME_DIFF_OLD_ANT1 )
//#endif																		     


#define UDFDEF_ADDR_DBSCAN_BASE                 ( BBE_ABUF1_BASE + 8*1024 )
#define UDFDEF_SIZE_DBSCAN_STRUCT               ( 8*1024 )
																					     
#define UDFDEF_ADDR_UART_OUTPUT                 ( BBE_ABUF1_BASE + 0 )
#define UDFDEF_ADDR_DEBUG_OUTPUT                ( BBE_ABUF0_BASE + 0 ) // not used

#define UDFDEF_DBSCAN_MINIPTS                   ( 0x01 )
#define UDFDEF_DBSCAN_EPS_R_IDX                 ( 0x03 )
#define UDFDEF_DBSCAN_EPS_V_IDX                 ( 0x03 )
#define UDFDEF_DBSCAN_EPS_SINPHI_IDX            ( 0x14 )
#define UDFDEF_DBSCAN_MEAN_NUM                  ( 0x8  )

#define VEL_RES_MM_S                            (0)

// 必须保证UDF_global结构体类型有定义 
// magic_flag_A、magic_flag_B为构建需要初始值不可修改，且位置必须位于结构体最后。
typedef struct{
	uint32_t udf_tick;	
	uint32_t udf_tick_rcd;
	uint8_t  work_mode;
	uint8_t  frame_backup_index;
//	#if (TEST_MODE==6)//(UDFDEF_ADCSAMP_NUM * UDFDEF_ANT_NUM * UDFDEF_ADC_BKUP_CHIRP_NUM_MAX) > (UDFDEF_RANGE_USE * UDFDEF_ANT_NUM * 4)
//	uint32_t frame_backup[UDFDEF_BKUP_FRAME_NUM][UDFDEF_ADCSAMP_NUM * UDFDEF_ANT_NUM * UDFDEF_ADC_BKUP_CHIRP_NUM_MAX / 4];
	
//	#if (TEST_MODE==6) || (DEMO_RANGE_REFINEMENT==2)
//	#else
//	uint32_t frame_bkup_buff[UDFDEF_BKUP_FRAME_NUM][UDFDEF_RANGE_USE * UDFDEF_ANT_NUM];
//	#endif
	uint32_t *frame_bkup_pbuff[UDFDEF_BKUP_FRAME_NUM][UDFDEF_RANGE_USE * UDFDEF_ANT_NUM];
  
	uint8_t i2c_reg00;
	uint8_t i2c_reg10;
	uint8_t i2c_reg11;
	uint8_t i2c_reg12;
	uint8_t i2c_reg13; 
	uint8_t i2c_reg31;
	uint8_t i2c_reg32;
	uint8_t i2c_reg3e;
	uint8_t i2c_reg3f;	
	uint8_t i2c_reg41;
	uint8_t i2c_reg42;
	uint8_t i2c_reg43;
//	uint8_t i2c_reg44;
	uint8_t i2c_reg45;
	uint8_t i2c_reg4e;
	uint8_t i2c_reg4f;
	uint8_t i2c_reg5c;
	uint8_t i2c_reg61;
//	uint8_t i2c_reg68;
	uint8_t i2c_reg71;
	uint8_t i2c_reg72;	
	uint8_t i2c_reg73;
	uint8_t i2c_reg74;	
	uint8_t i2c_reg75;
//	uint8_t i2c_reg76;	
	
	
	uint8_t i2c_regaa;
	uint8_t i2c_regbb[256];
	
	uint8_t binpage_cnt;
	
	uint8_t start_f;
	uint8_t stop_f;
	uint8_t state;
  uint32_t cnt;
	uint8_t rtc_f;	
	uint32_t debugCnt;	  
  	

	uint32_t recv_buff[PAGE_PACK_LEN/sizeof(uint32_t)];  
  uint8_t ota_status;
	uint32_t ota_len;
	
	uint8_t version[4];

	uint32_t magic_flag_A;
	uint32_t magic_flag_B;
}sUDF_global_t;

extern sUDF_global_t sUDF_global;

#endif
